/**
 * 网络请求类，
 * 封装整个应用的网络请求拦截器，
 * 响应拦截器 ，和一些基础设置
 * 导入网络类包axios,路由router(处理需要跳出登录的情况），反馈信息处理
 */
import axios from 'axios'
import {
  Message
} from 'element-ui'
import NProgress from 'nprogress' // Progress 进度条
import Qs from 'qs'
import router from '@/router'
import store from '@/store'

const service = axios.create({
  baseURL: process.env.BASE_API,
  withCredentials: true,
})
//request拦截器
service.interceptors.request.use(config => {
  NProgress.start();
  //这里可以写自定义请求头信息； config.headers['x-token'] = ...
  config.headers['token'] = localStorage.getItem('token') || ''
  return config
}, error => {
  Promise.reject(error)
})
//response拦截器
service.interceptors.response.use(response => {
  let showMsg = response.config.headers.showMsg;

  NProgress.done();
  // // token验证
  // let token = response.data.token;

  // if (token && token != null) {
  //   localStorage.setItem('token', token)
  // }

  let token = response.headers['authorization'];

  if (token != undefined && token && token != null) {
    // console.log(token, 'to ken验证')
    localStorage.setItem('token', token)
  }
  if (response.status == 200) {
    //网络请求状态码为200，然后处理业务code；( 下载特殊处理 )
    if (response.config.responseType == "blob") {
      return Promise.resolve(response.data)
    }
    //暂时解决数据结构不统一问题
    let {
      data
    } = response;
    if (data.result && data.result.records) {
      data.result.rows = data.result.records
    }

    /*
    700	用户被踢出
    701	用户未授权
    702	用户未登陆
    703	用户密码错误
    600	验证码错误
    601	用户不存在
    602	用户被锁定
    603	IP错误无法访问
    604	密码次数过多
    605	用户注销
    606	用户休眠请联系管理员解决
    607	不在访问时间内
    800	业务出错
    801	创建重复数据
    802	写入文件失败
    803	存在子集，禁止操作
    804	文档解析出错
    805	同步出错
    806	数据未同步
    807	站级网络掉线
    */

    switch (data.code) {
      case 200:
        if (data.success) {

          return Promise.resolve(data)
        } else {
          if (response.config.url.indexOf('/cameraControl/isPaly') < 0) {
            Message({
              message: data.msg,
              type: 'error',
              duration: 5 * 1000
            })
          }
          return Promise.reject(data)
        }
        break;
      case 700:
        //用户被踢出
        localStorage.clear();
        store.commit('app/CLEAR_ROUTES');
        router.replace({
          name: 'login',
          replace: true,
          query: {
            out: data.msg
          }
        })
        return Promise.reject(data);
        break;
      case 701:
        // 用户未授权
        Message({
          message: data.msg,
          type: 'error',
          duration: 5 * 1000
        })
        return Promise.reject(data)
        break;
      case 702:
        // 用户未登陆
        Message({
          message: data.msg,
          type: 'error',
          duration: 5 * 1000
        })
        return Promise.reject(data);
        break;
      case 333:
        //重定向到修改密码界面
        return Promise.reject(data);
        break;
      case 301:
        //session过期，从新登陆
        Message({
          message: data.msg,
          type: 'error',
          duration: 1 * 1000
        })
        localStorage.clear();
        store.commit('app/CLEAR_ROUTES');
        if (!location.href.includes('/login')) {
          router.replace({
            name: 'login',
            replace: true,
            params: {
              out: data.msg
            }
          })
        }
        return Promise.reject(data);
        break;
      case 302:
        //用户需要从新修改密码
        // localStorage.clear();
        store.commit('app/CLEAR_ROUTES');
        setTimeout(() => {
          router.replace({
            path: '/changepwd',
            replace: true
          })
        }, 2000)
        Message({
          message: data.msg,
          type: 'error',
          duration: 3 * 1000
        })
        return Promise.reject(data);
        break;
      case 800:
        // 业务出错
        if (response.config.url.indexOf('/cameraControl/isPaly') < 0) {
          if (showMsg != 'hidden') {
            Message({
              message: data.msg,
              type: 'error',
              duration: 3 * 1000
            })
          }
          return Promise.rejectnm(data);
        }
        break;
      default:
        if (response.config.headers.showMsg != 'hidden') {
          Message({
            message: data.msg,
            type: 'error',
            duration: 5 * 1000
          })
        }
        return Promise.reject(data)
        break;
    }
  }
}, error => {
  //,统一处理异常,(联系管理员)
  Message({
    message: '联系开发人员',
    type: 'error',
    duration: 5 * 1000
  })
  return Promise.reject(error);
})

// 封装调用后端接口的Api
export default function Api(url, method, data = {}, istransform = true, extra) {
  let requestObj = {
    url,
    method
  }
  if (method.toLocaleLowerCase() == 'post') {
    if (istransform) {
      requestObj.transformRequest = [function (data) {
        return Qs.stringify(data)
      }]
    }
    if (extra && extra == 'blob') {
      //导出额外设置响应类型
      requestObj.responseType = extra;
    }
    if (extra && extra == 'timeoutMore') {
      requestObj.timeout = 30000
    }
    if (extra && typeof extra == 'object') {
      //添加额外请求头(这里是需要加密的)
      requestObj.headers = extra;
    }
    if (extra == 'hidden') {
      requestObj.headers = {
        showMsg: extra
      }
    }
    requestObj.data = data;

  } else if (method.toLocaleLowerCase() == 'get') {
    requestObj.params = data

  }
  return service(requestObj)
}
